<?php

declare(strict_types=1);

namespace App\Repositories;

use App\Helpers\Database;
use App\Helpers\Date;
use App\Models\ContactModel;

class ContactRepository
{
    public function __construct(private ContactModel $contactModel = new ContactModel) {}

    /**
     * Consulta la información de todos los contactos de un usuario con paginación.
     */
    public function getAllByUserIdWithPagination(string $userId): array
    {
        return $this->contactModel->reset()
            ->where('user_id', $userId)
            ->get();
    }

    /**
     * Registra la información de un contacto.
     */
    public function insertByUserId(string $userId, array $data): string
    {
        $id = Database::generateUuid();

        $data = array_merge($data, [
            'id' => $id,
            'user_id' => $userId,
            'created_at' => Date::getCurrentDatetime(),
            'updated_at' => Date::getCurrentDatetime(),
        ]);

        $this->contactModel->reset()->insert($data);

        return $id;
    }

    /**
     * Consulta la información detallada del contacto de un usuario.
     */
    public function findDetailsByIdAndUserId(string $contactId, string $userId): ?array
    {
        return $this->contactModel->reset()
            ->where('user_id', $userId)
            ->find($contactId);
    }

    /**
     * Actualiza la información del contacto de un usuario.
     */
    public function updateByUserId(string $contactId, string $userId, array $data): void
    {
        $data['updated_at'] = Date::getCurrentDatetime();

        $this->contactModel->reset()
            ->where('id', $contactId)
            ->where('user_id', $userId)
            ->update($data);
    }

    /**
     * Elimina la información del contacto de un usuario.
     */
    public function deleteByIdAndUserId(string $contactId, string $userId): void
    {
        $this->contactModel->reset()
            ->where('id', $contactId)
            ->where('user_id', $userId)
            ->delete();
    }
}
